package com.petsdar.utils;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created with IntelliJ IDEA
 * User: heroC
 * Date: 2020/6/27
 * Time: 19:15
 * Description: 该类用于对密码进行加密计算
 * Version: V1.0
 */
public class MD5 {

    /**
     * 获取md5加密结果。根据username数据，截取一定长度转换成字节。
     * 将字节转换成整型，调用重载函数
     * @param sourcePwd 未加密密码
     * @param saltUserName 用于加盐操作的用户名
     * @return
     */
    public static String getMD5(String sourcePwd, String saltUserName){
        byte[] bytes = saltUserName.getBytes();
        StringBuilder sb = new StringBuilder();
        for (int i = bytes.length-1; i > bytes.length-3; i--) {
            sb.append(bytes[i]);
        }
        return getMD5(sourcePwd, Integer.parseInt(sb+""));
    }

    /**
     * 获取md5加密后的密码。根据source原码，加密成md5密码，最后
     * 将salt数据参入md5密码中，返回最终md5密码。
     * @param source 未加密密码
     * @param salt 初md5，加盐的数据
     * @return
     */
    private static String getMD5(String source, int salt) {
        //将明文转换成byte[]
        byte [] bytes = source.getBytes();
        //将byte字节数组通过MessageDigest进行MD5运算，得到一个新的字节数组。
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            System.err.println("MessageDigest.getInstance() 有错");
        }
        byte [] newBytes = md.digest(bytes);
        //将新的字节数组转换成密文
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < newBytes.length; i++) {
            sb.append(String.format("%02X", newBytes[i]));
        }
        // 简单加盐，转换成16进制，取后3位插入到md5中
        String hexStr = Integer.toHexString(salt);
        if (hexStr.length() >= 3){
            String saltStr = hexStr.substring(hexStr.length() - 3);
            sb.insert(0,saltStr.charAt(0));
            sb.insert(12,saltStr.charAt(1));
            sb.insert(sb.length()-1,saltStr.charAt(2));
        }else {
            sb.insert(sb.length()-1,hexStr);
        }
        return sb+"";
    }
}
